package sis.search;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2019-07-31 19:16
 * @notify
 * @version 1.0
 */

import com.sun.deploy.util.StringUtils;
import sis.util.StringUtil;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;

//搜索 网页中是否有指定内容
public class Search {
    //Class URL表示统一资源定位符，指向万维网上的“资源”的指针。
    private URL url;

    private String searchString;

    //搜索到了几次相同内容
    private int matches = 0;

    private Exception exception = null;

    //构造子 给出网站路径 给出要搜索的 字符串
    public Search(String urlString, String searchString) throws IOException {
        //实例化 URL
        this.url = new URL(urlString);
        this.searchString = searchString;
    }

    //要搜索的字符串
    public String getText() {
        return searchString;
    }

    // URL 的字符串形式
    public String getUrl() {
        return url.toString();
    }

    //获取搜索到了几个相同内容
    public int matches() {
        return matches;
    }


    //没有异常返回 false
    public boolean errored() {
        return exception != null;
    }

    //获取异常
    public Exception getError() {
        return exception;
    }

    //执行搜索
    public void execute() {
        try {
            searchUrl();
        } catch (IOException e) {
            //赋值异常
            exception = e;
        }
    }

    //建立连接 开始搜索
    private void searchUrl() throws IOException {
        //getInputStream()
        InputStream input = getInputStream(url);
        //字符流缓冲区
        BufferedReader reader = null;
        try {
            //接收一个 字符流 ,但是从 URLConnection处得到的是一个字节流
            //此处用 转换流 将字节流转换成 字符流
            reader = new BufferedReader(new InputStreamReader(input));
            //要读取的字符串
            String line;
            //一行一行读
            while ((line = reader.readLine()) != null) {
                //读取一行 查询 是否有匹配的字符串
                matches += StringUtil.occurrences(line, searchString);
            }
        } finally {
            //关闭流
            if (reader != null) {
                reader.close();
            }
        }
    }

    private InputStream getInputStream(URL url) throws IOException {
        //URLConnection类
        // 抽象类URLConnection是表示应用程序和URL之间的通信链接的所有类的超类。 该类的实例可以用于从URL引用的资源中读取和写入
        //返回一个URLConnection实例，表示与URL引用的远程对象的URL
        if (url.getProtocol().startsWith("http")) {
            URLConnection connection = url.openConnection();
            return connection.getInputStream();
        } else if (url.getProtocol().equals("file")) {
            return new FileInputStream(url.getPath());
        } else {
            return null;
        }

    }
}
